<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>可变参数</title>
    <script>

        function fn() {
            /* 
                arguments
                    arguments是函数中又一个隐含参数
                    arguments是一个类数组(伪数组)对象。
                    arguments用来存储用户传入函数的实参,和形参长度没有关系。
                    无论是否定义形参，实参都会存储在arguments对象中，可以通过arguments对象直接访问实参。
            */
            console.log('我是一个函数')
            console.log(arguments)
            console.log(arguments.length)
        }


        function sum(){
            // 通过arguments，使得函数不受参数数量的限制，更加灵活的创建变量。
            let result = 0
            for (let i of arguments) {
                result = result + i
            }
            return result
        }


        /* 
        可变参数（...参数）
            在定义函数时，可以将参数指定为可变参数
                可变参数可以接受任意数量的实参，并将它们统一存储到一个数组中。
                可变参数的作用和arguments基本是一致的。


        可变参数和arguments的不同点
            1.可变参数的名字可以自己指定
            2.可变参数就是一个数组，可以直接使用数组的方法。
            3.可变参数可以配合其它参数一起使用
            3.当可变参数和其它普通参数一起使用时，需要将可变参数写到最后

        
        */

        function sum2(a,b,...args){
            return args.reduce((a,b)=>a+b,0)
        }
        // a=1，b=2,args=[1,0,1,1]
        console.log(sum2(1,2,1,0,1,1))    

        function fn3(){
            for(let i of arguments){
                console.log(i)
            }
        }


    </script>
</head>

<body>

</body>

</html>